/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Controller;

import Model.Utilisateur;
import Model.Commande;
import Model.Restaurant;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

/**
 *
 * @author aj48640
 */
public class ControllerCommande
{
    private static ControllerCommande instance;
    
    public static ControllerCommande getInstance()
    {
        if (instance == null )
        {
            instance = new ControllerCommande();
        }
        
        return instance;
    }
    //liste des restaurants
    private ArrayList<Restaurant> restaurants;
   /* private Utilisateur utilisateur;*/
    //fait le lien entre le client et l'adresse
    private HashMap<String,String> utilisateurs;
    //la commande qui contient le plat, la quantité
    private Commande commande;
    //La liste des commandes
    private ArrayList<Commande> listeCommande;
    
    private Utilisateur utilisateur;
    
    
    private ControllerCommande () 
    {   
        this.restaurants = new ArrayList<Restaurant>();   
        this.utilisateurs = new HashMap<String, String>();
        this.listeCommande = new ArrayList<Commande>();
        
        this.ObtenirDonnees(); 
    }
    
    public void DebuterCommande( Utilisateur client )
    {
        this.commande = new Commande(client);
    }
    
    /**
     * Obtient les données pour nos restaurants et plats.
     * Cette méthode va être changé dans une future itération s'il y a un
     * besoin de base de données
     */
    private void ObtenirDonnees ( )
    {
        
        this.restaurants.add(new Restaurant("Mangiamo","1460 Ch Gascon Terrebonne, QC, J6X 2Z5"));
        this.restaurants.add(new Restaurant("Hard Rock Cafe","1458 Crescent St, Montréal"));
        
        this.restaurants.add(new Restaurant("Alberta Hard Rock Cafe","Alberta, Canada"));

        this.restaurants.get(0).AjouterPlat("Spaghetti");
        this.restaurants.get(0).AjouterPlat("Pizza");
        this.restaurants.get(0).AjouterPlat("Penne");
        
        this.restaurants.get(1).AjouterPlat("Hamburger");
        this.restaurants.get(1).AjouterPlat("CheeseBurger");
        this.restaurants.get(1).AjouterPlat("Double CheeseBurger");
        
        this.restaurants.get(2).AjouterPlat("Hamburger");
        this.restaurants.get(2).AjouterPlat("CheeseBurger");
        this.restaurants.get(2).AjouterPlat("Double CheeseBurger");
        
        //client
      /*  this.utilisateurs.put("log210", "ETS Street");
        this.utilisateurs.put("georges debay", "la lune");
        this.utilisateurs.put("client1", "123 rue Mireille");
        this.utilisateurs.put("ditto", "321 rue de l'harmonie");
        this.utilisateurs.put("scarface", "007 rue miami");  */
    }
   
    /**
     * Permet d'aller chercher le nom des restaurants
     * Nous retournons seulement le nom pour empêcher le couplage
     * @return 
     */
    public ArrayList<String> GetRestaurants ()
    {
        ArrayList<String> tmp = new ArrayList<String>();
        
        for(int i = 0 ; i < restaurants.size(); i++)
        {
            tmp.add(restaurants.get(i).GetNom());
        }
        
        return tmp;
    }
    
    /**
     * Retourne le nom des menu d'un restaurant passé
     * en paramètre
     * @param index
     * @return 
     */
    public ArrayList<String> GetMenu (int index)
    {
        return this.restaurants.get(index).ObtenirPlats();
    }
    
    /**
     * Permet de valider si le client existe dans notre
     * "base de données"
     * @param nom
     * @return 
     */
    public boolean AuthentifierClient ( String nom)
    {
        if ( utilisateurs.containsKey(nom))
        {
            //this.utilisateur = new Utilisateur(nom, utilisateurs.get(nom));
            //this.commande = new Commande(utilisateur); 
            //this.commande.setAdresse(this.utilisateur.getAdresse());
            return true;
        }
        return false;
    }
    
    /**
     * Retourne l'adresse du client qui est connecté au système
     * @return 
     */
    public String GetAdresseClient ( )
    {
        return this.utilisateur.getAdresse();
    }
    
    /**
     * Méthode qui permet d'ajouter un plat à la ligne de commande
     * 
     * @param quantite
     * @param plat
     * @param restaurant 
     */
    public void AjouterPlat ( int quantite, String plat, String restaurant)
    {
        this.commande.addLigne(Restaurant.FindRestaurant(restaurants, restaurant).ObtenirPlat(plat), quantite); 
        this.commande.AddAdresseRestaurant(Restaurant.FindRestaurant(restaurants, restaurant).GetAdresse());
    }
    
    
    /**
     * Permet de changer d'adresse lorsque ce n'est pas l'adresse par défaut qui va êtr utiliser
     * @param nouvelleAdresse 
     */
    public void ChangerAdresse ( String nouvelleAdresse  )
    {
        this.commande.setAdresse(nouvelleAdresse);
    }
    
    /**
     * Affiche un message pour finaliser la commande.
     * Dans une future itération, cette méthode va finialiser l'objet commande
     * et le préparer pour une utilisation future.
     * @return 
     */
    public String FinaliserCommande (Date date)
    {
       String information = "";
       this.commande.setDateLivraison(date);
       
       information += "Nom du client : " + this.commande.getClient().getNom() + "\n" +
                      "Adresse de livraison : " + this.commande.getAdresse() + "\n" +
                      "No confirmation : " + this.commande.ObtenirNoConfirmation() + "\n" +
                      "Date de livraison : " + this.commande.getDateLivraison().toLocaleString() + "\n";
       
       for ( int i = 0; i < this.commande.NombrePlats(); i++ )
       {
           information += this.commande.ObtenirLigneCommande(i).GetNomPlat() + " : " + this.commande.ObtenirLigneCommande(i).GetQuantite() + "\n";
       }
       
       listeCommande.add(this.commande);
      
       return information;
       
    }
    public int getNombreCommande ()
    {
        return this.listeCommande.size();
    }
    
    public Commande getCommande(int no)
    {
        return listeCommande.get(no);
    }
    
    public void EnleverCommande ( int index )
    {
        this.listeCommande.remove(index);
    }
    
    
}
